package com.lw.sbdemo2.service;

import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.github.pagehelper.PageHelper;
import com.lw.sbdemo2.common.base.CrudService;
import com.lw.sbdemo2.common.constant.MzConstants;
import com.lw.sbdemo2.common.utils.IdUtils;
import com.lw.sbdemo2.common.vo.PageInfo;
import com.lw.sbdemo2.entity.TkUserInfo;
import com.lw.sbdemo2.mapper.TkUserInfoMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * <p>标题: 用户信息表服务 - 业务逻辑层</p>
 * <p>描述: </p>
 * <p>版权: Copyright (c) 2019</p>
 * <p>公司: 山人行工作室</p>
 *
 * @version: 1.0
 * @author: LinWang
 * @date 2019-4-14
 */
@Slf4j
@Service
public class TkUserInfoService extends CrudService<TkUserInfo, TkUserInfoMapper> {

    @Autowired
    private TkUserInfoMapper userInfoMapper;

    /**
     * 获取用户分页列表
     *
     * @param query      搜索关键词
     * @param pageInfo   分页实体
     * @param tkUserInfo 实体入参
     * @return 用户列表
     */
    public PageInfo<TkUserInfo> findListPage(String query, PageInfo pageInfo, TkUserInfo tkUserInfo) {
        PageHelper.startPage(pageInfo);
        List<TkUserInfo> tkUserInfolist = this.dao.findListPage(query, tkUserInfo);
        return new PageInfo<>(tkUserInfolist);
    }

    /**
     * 获取用户分页列表
     *
     * @param query      搜索关键词
     * @param tkUserInfo 实体入参
     * @return 用户列表
     */
    public List<TkUserInfo> findListGrade(String query, TkUserInfo tkUserInfo) {
        List<TkUserInfo> tkUserInfolist = this.dao.findListPage(query, tkUserInfo);
        return tkUserInfolist;
    }

    /**
     * 用户登录逻辑
     *
     * @param session 小程序实体
     * @return 用户默认卡实体
     */
    public TkUserInfo userLogin(WxMaJscode2SessionResult session, String appId) {

        String unionId = session.getUnionid();
        String openId = session.getOpenid();
        String userId;
        TkUserInfo userInfo;

        log.info("根据code获取到Session信息，unionId={}, openid= {}", unionId, openId);

        //若未关注公众号，此时unionId为空，使用小程序ID获取
        userInfo = userInfoMapper.getUserByOpenId(openId);
        log.info("根据minOpenid获取用户基本信息，userInfo={}", userInfo);

        if (userInfo == null) {

            log.info("不存在用户信息~");

            // 若不存在，则代表未登录过小程序，做法如下：
            // 做法是：创建一个userid，并且把unionId、userId、minOpenid以及一些基本信息插入用户信息表
            // 创建缓存，key为wxuser:userid，value是上述用户信息实体
            userId = IdUtils.uuid(false);
            userInfo = new TkUserInfo();
            userInfo.setUserId(userId);
            userInfo.setOpenId(session.getOpenid());
            userInfo.setCreatedTime(new Date());
            userInfo.setValidFlag(MzConstants.USER_VALID_OK);
            userInfo.setLastLoginTime(new Date());

            //插入数据
            userInfoMapper.insert(userInfo);

            //若不存在，返回给前端的病人ID等数据为空，只有userId
        } else {

            log.info("存在用户信息~");

            userId = userInfo.getUserId();

            // 若存在，则代表几种可能：
            // 1、已关注过公众号
            // 2、曾经登录过小程序
            TkUserInfo userInfoDb = new TkUserInfo();
            userInfoDb.setUserId(userId);
            userInfoDb.setLastLoginTime(new Date());
            userInfoDb.setModifiedTime(new Date());
            userInfoMapper.update(userInfoDb);

            userInfo.setLastLoginTime(userInfoDb.getLastLoginTime());
            userInfo.setModifiedTime(userInfoDb.getModifiedTime());

            log.info("更新用户信息~{}", userId);
        }

        return userInfo;
    }
}
